package document

import (
	"context"
	"fmt"
	"net/http"
	"os"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/cloudwego/eino-ext/components/document/loader/file"
	"github.com/cloudwego/eino-ext/components/document/loader/s3"
	"github.com/cloudwego/eino-ext/components/document/loader/url"
	"github.com/cloudwego/eino/components/document"
	"github.com/cloudwego/eino/schema"
)

// 导入errors.go中定义的错误变量

// DocumentLoader 定义文档加载接口
type DocumentLoader interface {
	Load(ctx context.Context, uri string) ([]*schema.Document, error)
}

// DownloadDocumentFromS3 从Amazon S3下载文档
// 参数:
//   - ctx: 上下文，用于传递请求超时等控制信息
//   - region: AWS区域
//   - accessKey: AWS访问密钥
//   - secretKey: AWS秘密密钥
//   - bucket: S3存储桶名称
//   - objectKey: S3对象键
//
// 返回:
//   - []*schema.Document: 加载的文档列表
//   - error: 错误信息
func DownloadDocumentFromS3(ctx context.Context, region, accessKey, secretKey, bucket, objectKey string) ([]*schema.Document, error) {
	// 参数验证
	if region == "" || accessKey == "" || secretKey == "" || bucket == "" || objectKey == "" {
		return nil, fmt.Errorf("%w: 缺少必要参数", ErrInvalidParameter)
	}

	// 创建S3加载器
	loader, err := s3.NewS3Loader(ctx, &s3.LoaderConfig{
		Region:           aws.String(region),
		AWSAccessKey:     aws.String(accessKey),
		AWSSecretKey:     aws.String(secretKey),
		UseObjectKeyAsID: true,
	})
	if err != nil {
		return nil, fmt.Errorf("初始化S3加载器失败: %w", err)
	}

	// 构造S3 URI
	s3URI := fmt.Sprintf("s3://%s/%s", bucket, objectKey)

	// 加载文档
	docs, err := loader.Load(ctx, document.Source{
		URI: s3URI,
	})
	if err != nil {
		return nil, fmt.Errorf("%w: %w", ErrLoadDocumentFailed, err)
	}

	return docs, nil
}

// DownloadDocumentFromLocal 从本地文件系统加载文档
// 参数:
//   - ctx: 上下文
//   - filePath: 本地文件路径
//   - useNameAsID: 是否使用文件名作为文档ID
//
// 返回:
//   - []*schema.Document: 加载的文档列表
//   - error: 错误信息
func DownloadDocumentFromLocal(ctx context.Context, filePath string, useNameAsID bool) ([]*schema.Document, error) {
	// 参数验证
	if filePath == "" {
		return nil, fmt.Errorf("%w: 文件路径不能为空", ErrInvalidParameter)
	}

	// 检查文件是否存在
	if _, err := os.Stat(filePath); os.IsNotExist(err) {
		return nil, fmt.Errorf("%w: 文件不存在", ErrLoadDocumentFailed)
	}

	// 创建文件加载器
	loader, err := file.NewFileLoader(ctx, &file.FileLoaderConfig{
		UseNameAsID: useNameAsID,
		// 移除Parser配置，使用默认解析器
	})
	if err != nil {
		return nil, fmt.Errorf("初始化文件加载器失败: %w", err)
	}

	// 加载文档
	docs, err := loader.Load(ctx, document.Source{
		URI: filePath,
	})
	if err != nil {
		return nil, fmt.Errorf("%w: %w", ErrLoadDocumentFailed, err)
	}

	return docs, nil
}

// DownloadDocumentFromWeb 从Web URL下载文档
// 参数:
//   - ctx: 上下文
//   - urlStr: 文档URL
//   - parser: 文档解析器（可选，当前版本暂不使用）
//   - client: HTTP客户端，如果为nil则使用默认客户端
//
// 返回:
//   - []*schema.Document: 加载的文档列表
//   - error: 错误信息
func DownloadDocumentFromWeb(ctx context.Context, urlStr string, parser interface{}, client *http.Client) ([]*schema.Document, error) {
	// 参数验证
	if urlStr == "" {
		return nil, fmt.Errorf("%w: URL不能为空", ErrInvalidParameter)
	}

	// 使用默认配置初始化加载器
	loader, err := url.NewLoader(ctx, nil)
	if err != nil {
		panic(err)
	}

	// 加载文档
	docs, err := loader.Load(ctx, document.Source{
		URI: urlStr,
	})
	if err != nil {
		panic(err)
	}

	if err != nil {
		return nil, fmt.Errorf("%w: %w", ErrLoadDocumentFailed, err)
	}

	return docs, nil
}

// LoadDocument 统一的文档加载函数，根据URI前缀自动选择加载器
// 参数:
//   - ctx: 上下文
//   - uri: 文档URI，可以是本地路径、S3 URI或HTTP URL
//
// 返回:
//   - []*schema.Document: 加载的文档列表
//   - error: 错误信息
func LoadDocument(ctx context.Context, uri string) ([]*schema.Document, error) {
	// 根据URI前缀选择加载方式
	switch {
	case uri[:5] == "s3://":
		// S3路径格式: s3://bucket/objectKey
		// 这里仅作为示例，实际使用时需要正确解析S3路径并提供AWS凭证
		return DownloadDocumentFromS3(ctx, "us-east-1", "accessKey", "secretKey", "bucket", "objectKey")
	case uri[:7] == "http://" || uri[:8] == "https://":
		// Web URL
		return DownloadDocumentFromWeb(ctx, uri, nil, nil)
	default:
		// 假定为本地文件路径
		return DownloadDocumentFromLocal(ctx, uri, true)
	}
}
